package com.fantaike.algorithm.sort;

import java.util.concurrent.CompletableFuture;

/**
 * 冒泡排序法：相邻元素两两比较，第一次比较后最大值出现在最开始（从大到小）或者最末尾（从小到大）
 * @author jishushen
 * @create 2021-07-31 11:43
 */
public class Dubble {
    /**
     * @Description: 第一种：对数组arr中的元素进行排序，推荐
     * @param arr
     * @Date: 2021/7/31 11:44
     * @Author: xuepeng
     * @Return
     * @Throws
     */
    public static void sort(Comparable[] arr){
        for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                //如果前一个数比后一个数大
                if (greater(arr[j],arr[j+1])){
                    //二者进行交换
                    exch(arr,j,j+1);
                }
            }
        }
    }

    /**
     * @Description: 第二种：对数组排序的方法
     * @param arr
     * @Date: 2021/7/31 12:18
     * @Author: xuepeng
     * @Return
     * @Throws
     */
    public static void sortTwo(Comparable[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 -i; j++) {
                if (greater(arr[j],arr[j+1])){
                    exch(arr,j,j+1);
                }
            }
        }
    }

    /**
     * @Description: 比较v元素是否大于w,如果v大于w返值为true,反之false
     * @param v
     * @param w
     * @Date: 2021/7/31 11:46
     * @Author: xuepeng
     * @Return
     * @Throws
     */
    public static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /**
     * @Description: 将数组i和j的位置进行交换
     * @param arr
     * @param i
     * @param j
     * @Date: 2021/7/31 11:49
     * @Author: xuepeng
     * @Return
     * @Throws
     */
    public static void exch(Comparable[] arr,int i,int j){
        Comparable temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
